﻿using System;
using System.Linq;
using System.Collections.Generic;
using SIM.Geo.DA;
using SIM.Geo.BE;
using System.Transactions;

namespace SIM.Geo.BL
{
    public class BLPuntoTopografico
    {
        #region Metodos
        /// <summary>
        /// Método que devuelve la lista de puntos topográficos
        /// </summary>
        /// <returns></returns>
        public List<PuntoTopografico> ListarPuntoTopografico()
        {
            return Accesor.ListarPuntoTopografico();
        }
        /// <summary>
        /// Método insertar un nuevo punto topográfico
        /// </summary>
        /// <param name="puntotopografico"></param>
        /// <returns></returns>
        public int InsertarPuntoTopografico(PuntoTopografico puntotopografico)
        {
            int codigoNuevo = this.GenerarCodigoPuntoTopografico();
            puntotopografico.CodigoPuntoTopografico = codigoNuevo;
            return Accesor.InsertarPuntoTopografico(puntotopografico);
        }
        /// <summary>
        /// Método modificar un punto topográfico
        /// </summary>
        /// <param name="puntotopografico"></param>
        public void ModificarPuntoTopografico(PuntoTopografico puntotopografico)
        {
            var puntotopograficoEdit = Accesor.ObtenerPuntoTopografico(puntotopografico.CodigoPuntoTopografico);
            puntotopograficoEdit.Nombre = puntotopografico.Nombre;
            puntotopograficoEdit.CodigoLabor = puntotopografico.CodigoLabor;
            puntotopograficoEdit.Este = puntotopografico.Este;
            puntotopograficoEdit.Norte = puntotopografico.Norte;
            puntotopograficoEdit.CotaTecho = puntotopografico.CotaTecho;
            puntotopograficoEdit.CotaPiso = puntotopografico.CotaPiso;
            puntotopograficoEdit.CodigoUnidad = puntotopografico.CodigoUnidad;
            puntotopograficoEdit.Observacion = puntotopografico.Observacion;
            //falta agregar 2 campos
            Accesor.ModificarPuntoTopografico(puntotopograficoEdit);
        }
        /// <summary>
        /// Método eliminar un punto topografico
        /// </summary>
        /// <param name="codigoPuntoTopografico"></param>
        public void EliminarPuntoTopografico(int codigoPuntoTopografico)
        {
            var puntotopografico = this.ObtenerPuntoTopografico(codigoPuntoTopografico);
            Accesor.EliminarPuntoTopografico(puntotopografico);
        }
        /// <summary>
        /// Método obtener punto otpográfico por codigo
        /// </summary>
        /// <param name="codigoPuntoTopografico"></param>
        /// <returns></returns>
        public PuntoTopografico ObtenerPuntoTopografico(int codigoPuntoTopografico)
        {
            return Accesor.ObtenerPuntoTopografico(codigoPuntoTopografico);
        }
        /// <summary>
        /// Método listar punto topografico por nombre
        /// </summary>
        /// <param name="nombrePuntoTopografico"></param>
        /// <returns></returns>
        public List<PuntoTopografico> ListarPuntoTopograficoPorNombre(string nombrePuntoTopografico)
        {
            return Accesor.ListarPuntoTopograficoPorNombre(nombrePuntoTopografico);
        }
        public List<ListItemInt> ObtenerListItem()
        {
            var result = Accesor.ListarPuntoTopografico();
            return result.Select(x => new ListItemInt { Value = x.CodigoPuntoTopografico, Text = x.Nombre }).OrderBy(x => x.Text).ToList();
        }
        #endregion
        #region Utilidades
        /// <summary>
        /// Método que genera el codigo punto topográfico
        /// </summary>
        /// <returns></returns>
        public int GenerarCodigoPuntoTopografico()
        {
            int codigoMaximo = 1;
            var lista = Accesor.ListarPuntoTopografico();
            if (lista.Count > 0)
            {
                codigoMaximo = lista.OrderByDescending(x => x.CodigoPuntoTopografico).FirstOrDefault().CodigoPuntoTopografico + 1;
            }
            return codigoMaximo;
        }
        #endregion
        #region Accesor
        private static DAPuntoTopografico Accesor
        {
            [System.Diagnostics.DebuggerStepThrough]
            get { return new DAPuntoTopografico(); }
        }

        #endregion Accesor
    }
}
